// #include <iostream>
// #include <thread>
// #include <unistd.h>
// using namespace std;

// void hello()
// {
//     while(1)
//     {
//         cout << "我是新线程" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t(hello);
//     while(1)
//     {
//         cout << "我是主线程" << endl;
//         sleep(1);
//     }
//     t.join();
//     return 0;
// }

#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include <cstring>
#include <cstdlib>
using namespace std;

class Task
{
public:
    Task(int a, int b) : _a(a), _b(b) {}
    int Exec()
    {
        return _a + _b;
    }
    ~Task() {}
private:
    int _a;
    int _b;
};

class Result
{
public:
    Result(int result) : _result(result) {}
    
    int GetResult()
    {
        return _result;
    }

    ~Result() {}
private:
    int _result;
};

void showtid(pthread_t &tid)
{
    printf("tid: 0x%lx\n", tid);
}

string FormatId(pthread_t tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);
    return id;
}

// 线程终止
// 1.线程的入口函数进行return就是终止
// 2.线程不能用exit()终止, 用pthread_exit()
// 3.pthread_cancel()
void *threadrun(void *args)
{
    // Task* tp = static_cast<Task*>(args);
    // Result* res = new Result(tp->Exec());

    // //sleep(100);

    // //pthread_exit((void*)res); // 一般还是用return
    // return (void*)res;

    string name = (char *)args;
    pthread_t tid = pthread_self();
    pthread_detach(tid); //新线程可以分离自己
    int cnt = 5;
    while (cnt--)
    {
        cout << "我是新线程:" << name << " 我的tid: " << FormatId(tid) << endl;
        sleep(1);
    }
    return (void*)100;
}

int main()
{
    //创建新线程
    pthread_t tid;
    // Task *tp = new Task(1, 2);
    int n = pthread_create(&tid, nullptr, threadrun, (void*)"jiuqi");
    
    // pthread_detach(tid); // 新线程被分离后就不呢join
    // cout << "新线程被分离" << endl;

    // 新线程的tid
    //showtid(tid); 

    int cnt = 5;
    while (cnt--)
    {
        // pthread_self() 查到自己的tid
        cout << "我是main线程:" << " 我的tid: " << FormatId(pthread_self()) << endl;
        sleep(1);
    }

    int m = pthread_join(tid, nullptr);
    if(m != 0)
    {
        cout << "pthread_join error: " << strerror(n) << endl;
    }

    // 取消新线程
    // sleep(3);
    // pthread_cancel(tid); 
    // void* ret = nullptr;
    // pthread_join(tid, &ret); 
    // cout << "ret = " << (long long int)ret << endl;

    // // 获取新线程退出码
    // void *ret = nullptr;
 
    // // 等待的目标线程, 如果异常了, 整个进程都退出了, 包括main线程, 所以, join异常没有意义, 看不到
    // // join都是基于: 线程健康跑完的情况, 不需要处理异常情况
    // pthread_join(tid, &ret); // 主线程等待新线程结束, 可以获得新线程退出码(阻塞式)

    // cout << "ret = " << ((Result*)ret)->GetResult() << endl;

    // delete tp;

    return 0;
}